<?php
require_once "excepciones/ArchivoNoEncontradoException.class.php";
require_once "excepciones/ClaseNoEncontradaException.class.php";
require_once "excepciones/DefinicionDeClaseFaltanteException.class.php";

spl_autoload_register(array('Cargador','cargar'));

/**
 * Clase encargada de cargar las clases del sistema utilizando la técnica
 * Lazy Loading.
 * 
 * @author Willy A. Kuster
 */
class Cargador {
	
	private static $definiciones = array();

	public static function cargar($clase) {

		if (class_exists($clase, FALSE) || interface_exists($clase, FALSE))
			return;
			
		if (!isset(self::$definiciones[$clase])){
			eval('class ' . $clase . '{}');
			throw new DefinicionDeClaseFaltanteException($clase);
		}

		$archivo = self::$definiciones[$clase]."$clase.class.php";
		
		$rutaSistema = conf("general","amicitia_path")."/".$archivo;
		$existe = file_exists($rutaSistema);
		if(!$existe){
			eval('class ' . $clase . '{}');
			throw new ArchivoNoEncontradoException($archivo);
		}

		require $archivo;

		unset($archivo);

		if (!class_exists($clase, FALSE) && !interface_exists($clase, FALSE)) {
			eval('class ' . $clase . '{}');
			throw new ClaseNoEncontradaException($clase);
		}

	}
	
	public static function getDefiniciones(){
		return self::$definiciones;
	}
	
	public static function agregarDefiniciones(array $definiciones){
		self::$definiciones = array_merge(self::$definiciones,$definiciones);
	}
	
	public static function definir($camino,$clase) {
		self::$definiciones[$clase] = $camino;
	}

}

function def($camino,$clase) {
	Cargador::definir($camino,$clase);
}

?>